// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`classAbstractAccessor.ts 1`] = `

abstract class A {
   abstract get a();
   abstract get aa() { return 1; }
   abstract set b(x: string);
   abstract set bb(x: string) {}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {
  abstract get a();
  abstract get aa() {
    return 1;
  }
  abstract set b(x: string);
  abstract set bb(x: string) {}
}

`;

exports[`classAbstractAsIdentifier.ts 1`] = `
class abstract {
    foo() { return 1; }
}

new abstract;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class abstract {
  foo() {
    return 1;
  }
}

new abstract();

`;

exports[`classAbstractAssignabilityConstructorFunction.ts 1`] = `
abstract class A { }

var AAA: new() => A;

AAA = A;
AAA = "asdf";~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {}

var AAA: new () => A;

AAA = A;
AAA = "asdf";

`;

exports[`classAbstractClinterfaceAssignability.ts 1`] = `

var I: IConstructor;

abstract class A {
    x: number;
    static y: number;
}

var AA: typeof A;
AA = I;

var AAA: typeof I;
AAA = A;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var I: IConstructor;

abstract class A {
  x: number;
  static y: number;
}

var AA: typeof A;
AA = I;

var AAA: typeof I;
AAA = A;

`;

exports[`classAbstractConstructorAssignability.ts 1`] = `

class A {}

abstract class B extends A {}

class C extends B {}

var AA : typeof A = B;
var BB : typeof B = A;
var CC : typeof C = B;

new AA;
new BB;
new CC;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {}

abstract class B extends A {}

class C extends B {}

var AA: typeof A = B;
var BB: typeof B = A;
var CC: typeof C = B;

new AA();
new BB();
new CC();

`;

exports[`classAbstractCrashedOnce.ts 1`] = `
abstract class foo {
    protected abstract test();
}

class bar extends foo {
    test() {
    }
}
var x = new bar();~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class foo {
  protected abstract test();
}

class bar extends foo {
  test() {}
}
var x = new bar();

`;

exports[`classAbstractExtends.ts 1`] = `

class A {
    foo() {}
}

abstract class B extends A {
    abstract bar();
}

class C extends B { }

abstract class D extends B {}

class E extends B {
    bar() {}
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {
  foo() {}
}

abstract class B extends A {
  abstract bar();
}

class C extends B {}

abstract class D extends B {}

class E extends B {
  bar() {}
}

`;

exports[`classAbstractFactoryFunction.ts 1`] = `

class A {}
abstract class B extends A {}

function NewA(Factory: typeof A) {
    return new A;
}

function NewB(Factory: typeof B) {
    return new B;
}

NewA(A);
NewA(B);

NewB(A);
NewB(B);~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {}
abstract class B extends A {}

function NewA(Factory: typeof A) {
  return new A();
}

function NewB(Factory: typeof B) {
  return new B();
}

NewA(A);
NewA(B);

NewB(A);
NewB(B);

`;

exports[`classAbstractGeneric.ts 1`] = `
abstract class A<T> {
    t: T;

    abstract foo(): T;
    abstract bar(t: T);
}

abstract class B<T> extends A {}

class C<T> extends A {}

class D extends A {}

class E<T> extends A {
    foo() { return this.t; }
}

class F<T> extends A {
    bar(t : T) {}
}

class G<T> extends A {
    foo() { return this.t; }
    bar(t: T) { }
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A<T> {
  t: T;

  abstract foo(): T;
  abstract bar(t: T);
}

abstract class B<T> extends A {}

class C<T> extends A {}

class D extends A {}

class E<T> extends A {
  foo() {
    return this.t;
  }
}

class F<T> extends A {
  bar(t: T) {}
}

class G<T> extends A {
  foo() {
    return this.t;
  }
  bar(t: T) {}
}

`;

exports[`classAbstractImportInstantiation.ts 1`] = `

export abstract class A {}

new A;


new myA;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
export abstract class A {}

new A();

new myA();

`;

exports[`classAbstractInAModule.ts 1`] = `

export abstract class A {}
export class B extends A {}


new M.A;
new M.B;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
export abstract class A {}
export class B extends A {}

new M.A();
new M.B();

`;

exports[`classAbstractInheritance.ts 1`] = `
abstract class A {}

abstract class B extends A {}

class C extends A {}

abstract class AA {
    abstract foo();
}

abstract class BB extends AA {}

class CC extends AA {}

class DD extends BB {}

abstract class EE extends BB {}

class FF extends CC {}

abstract class GG extends CC {}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {}

abstract class B extends A {}

class C extends A {}

abstract class AA {
  abstract foo();
}

abstract class BB extends AA {}

class CC extends AA {}

class DD extends BB {}

abstract class EE extends BB {}

class FF extends CC {}

abstract class GG extends CC {}

`;

exports[`classAbstractInstantiations1.ts 1`] = `

abstract class A {}

class B extends A {}

abstract class C extends B {}

new A;
new A(1);
new B;
new C;

var a : A;
var b : B;
var c : C;

a = new B;
b = new B;
c = new B;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {}

class B extends A {}

abstract class C extends B {}

new A();
new A(1);
new B();
new C();

var a: A;
var b: B;
var c: C;

a = new B();
b = new B();
c = new B();

`;

exports[`classAbstractInstantiations2.ts 1`] = `
class A {
}

abstract class B {
    foo(): number { return this.bar(); }
    abstract bar() : number;
}

new B;

var BB: typeof B = B;
var AA: typeof A = BB;
new AA;

function constructB(Factory : typeof B) {
    new Factory;
}

var BB = B;
new BB;

var x : any = C;
new x;

class C extends B { }

abstract class D extends B { }

class E extends B {
    bar() { return 1; }
}

abstract class F extends B {
    abstract foo() : number;
    bar() { return 2; }
}

abstract class G {
    abstract qux(x : number) : string;
    abstract qux() : number;
    y : number;
    abstract quz(x : number, y : string) : boolean;

    abstract nom(): boolean;
    nom(x : number): boolean;
}

class H {
    abstract baz() : number;
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {}

abstract class B {
  foo(): number {
    return this.bar();
  }
  abstract bar(): number;
}

new B();

var BB: typeof B = B;
var AA: typeof A = BB;
new AA();

function constructB(Factory: typeof B) {
  new Factory();
}

var BB = B;
new BB();

var x: any = C;
new x();

class C extends B {}

abstract class D extends B {}

class E extends B {
  bar() {
    return 1;
  }
}

abstract class F extends B {
  abstract foo(): number;
  bar() {
    return 2;
  }
}

abstract class G {
  abstract qux(x: number): string;
  abstract qux(): number;
  y: number;
  abstract quz(x: number, y: string): boolean;

  abstract nom(): boolean;
  nom(x: number): boolean;
}

class H {
  abstract baz(): number;
}

`;

exports[`classAbstractMethodInNonAbstractClass.ts 1`] = `
class A {
    abstract foo();
}

class B {
    abstract foo() {}
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {
  abstract foo();
}

class B {
  abstract foo() {}
}

`;

exports[`classAbstractMethodWithImplementation.ts 1`] = `
abstract class A {
    abstract foo() {}
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {
  abstract foo() {}
}

`;

exports[`classAbstractMixedWithModifiers.ts 1`] = `
abstract class A {
    abstract foo_a();
    
    public abstract foo_b();
    protected abstract foo_c();
    private abstract foo_d();
    
    abstract public foo_bb();
    abstract protected foo_cc();
    abstract private foo_dd();
    
    abstract static foo_d();
    
    static abstract foo_e();
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {
  abstract foo_a();

  public abstract foo_b();
  protected abstract foo_c();
  private abstract foo_d();

  public abstract foo_bb();
  protected abstract foo_cc();
  private abstract foo_dd();

  static abstract foo_d();

  static abstract foo_e();
}

`;

exports[`classAbstractOverloads.ts 1`] = `
abstract class A {
    abstract foo();
    abstract foo() : number;
    abstract foo();
    
    abstract bar();
    bar();
    abstract bar();
    
    abstract baz();
    baz();
    abstract baz();
    baz() {}
    
    qux();
}

abstract class B {
    abstract foo() : number;
    abstract foo();
    x : number;
    abstract foo();
    abstract foo();
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {
  abstract foo();
  abstract foo(): number;
  abstract foo();

  abstract bar();
  bar();
  abstract bar();

  abstract baz();
  baz();
  abstract baz();
  baz() {}

  qux();
}

abstract class B {
  abstract foo(): number;
  abstract foo();
  x: number;
  abstract foo();
  abstract foo();
}

`;

exports[`classAbstractOverrideWithAbstract.ts 1`] = `
class A {
    foo() {}
}

abstract class B extends A {
    abstract foo();
}

abstract class AA {
    foo() {}
    abstract bar();
}

abstract class BB extends AA {
    abstract foo();
    bar () {}
}

class CC extends BB {}

class DD extends BB {
    foo() {}
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {
  foo() {}
}

abstract class B extends A {
  abstract foo();
}

abstract class AA {
  foo() {}
  abstract bar();
}

abstract class BB extends AA {
  abstract foo();
  bar() {}
}

class CC extends BB {}

class DD extends BB {
  foo() {}
}

`;

exports[`classAbstractProperties.ts 1`] = `
abstract class A {
    abstract x : number;
    public abstract y : number;
    protected abstract z : number;
    private abstract w : number;
    
    abstract m: () => void; 
    
    abstract foo_x() : number;
    public abstract foo_y() : number;
    protected abstract foo_z() : number;
    private abstract foo_w() : number;
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {
  abstract x: number;
  public abstract y: number;
  protected abstract z: number;
  private abstract w: number;

  abstract m: () => void;

  abstract foo_x(): number;
  public abstract foo_y(): number;
  protected abstract foo_z(): number;
  private abstract foo_w(): number;
}

`;

exports[`classAbstractSingleLineDecl.ts 1`] = `
abstract class A {}

abstract
class B {}

abstract

class C {}

new A;
new B;
new C;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {}

abstract;
class B {}

abstract;

class C {}

new A();
new B();
new C();

`;

exports[`classAbstractSuperCalls.ts 1`] = `

class A {
    foo() { return 1; }
}

abstract class B extends A {
    abstract foo();
    bar() { super.foo(); }
    baz() { return this.foo; }
}

class C extends B {
    foo() { return 2; }
    qux() { return super.foo() || super.foo; }
    norf() { return super.bar(); }
}

class AA {
    foo() { return 1; }
    bar() { return this.foo(); }
}

abstract class BB extends AA {
    abstract foo();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {
  foo() {
    return 1;
  }
}

abstract class B extends A {
  abstract foo();
  bar() {
    super.foo();
  }
  baz() {
    return this.foo;
  }
}

class C extends B {
  foo() {
    return 2;
  }
  qux() {
    return super.foo() || super.foo;
  }
  norf() {
    return super.bar();
  }
}

class AA {
  foo() {
    return 1;
  }
  bar() {
    return this.foo();
  }
}

abstract class BB extends AA {
  abstract foo();
}

`;

exports[`classAbstractUsingAbstractMethod1.ts 1`] = `
abstract class A {
    abstract foo() : number;
}

class B extends A {
    foo() { return 1; }
}

abstract class C extends A  {
    abstract foo() : number;
}

var a = new B;
a.foo();

a = new C;
a.foo();~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
abstract class A {
  abstract foo(): number;
}

class B extends A {
  foo() {
    return 1;
  }
}

abstract class C extends A {
  abstract foo(): number;
}

var a = new B();
a.foo();

a = new C();
a.foo();

`;

exports[`classAbstractUsingAbstractMethods2.ts 1`] = `
class A {
    abstract foo();
}

class B extends A  {}

abstract class C extends A {}

class D extends A {
    foo() {}
}

abstract class E extends A {
    foo() {}
}

abstract class AA {
    abstract foo();
}

class BB extends AA  {}

abstract class CC extends AA {}

class DD extends AA {
    foo() {}
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {
  abstract foo();
}

class B extends A {}

abstract class C extends A {}

class D extends A {
  foo() {}
}

abstract class E extends A {
  foo() {}
}

abstract class AA {
  abstract foo();
}

class BB extends AA {}

abstract class CC extends AA {}

class DD extends AA {
  foo() {}
}

`;

exports[`classAbstractWithInterface.ts 1`] = `
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

`;
